//
// Created by zhku666 on 25-2-24.
//
\
#include <stdio.h>
#include <cstring>

void add_sensor();
void delete_sensor();
void select_sensor();
void update_sensor();
int get_lock();
void unlock();

// 判断传感器ID是否存在
bool judge_sensor_id(const char *sensor_id) {
    FILE *file = fopen("sensor.txt", "r");
    if (!file) {
        return false; // 文件不存在或无法打开，返回不存在
    }

    char line[100];
    while (fgets(line, sizeof(line), file)) {
        char id[100];
        sscanf(line, "%[^-]", id);
        if (strcmp(id, sensor_id) == 0) {
            fclose(file);
            return true; // 找到匹配的sensor_id
        }
    }

    fclose(file);
    return false; // 未找到sensor_id
}

// 添加传感器
void add_sensor() {

    char sensor_id[100];
    printf("请输入传感器的ID：\n");
    scanf("%s", sensor_id);

    // 判断ID是否存在
    if (judge_sensor_id(sensor_id)) {
        printf("传感器ID '%s' 已存在\n", sensor_id);

        char logMessage[200];
        sprintf(logMessage, "添加传感器失败，id为:%s", sensor_id);
        log(logMessage);

        return;
    }

    get_lock();

    // 将数据写入文件
    FILE *file = fopen("sensor.txt", "a");
    if (!file) {
        perror("无法打开文件");
        return;
    }

    fprintf(file, "%s-%s-%d-%d\n", sensor_id, "NULL", 0, 0);
    fclose(file);

    char logMessage[200];
    sprintf(logMessage, "添加传感器成功，id为:%s", sensor_id);
    log(logMessage);

    unlock();
}

// 删除传感器
void delete_sensor() {
    char sensor_id[100];
    printf("请输入传感器的ID：\n");
    scanf("%s", sensor_id);

    // 判断ID是否存在
    if (!judge_sensor_id(sensor_id)) {
        printf("传感器ID '%s' 不存在\n", sensor_id);

        char logMessage[200];
        sprintf(logMessage, "该传感器不存在，删除失败，id为:%s", sensor_id);
        log(logMessage);
        return;
    }

    // 删除操作
    get_lock();

    FILE *file = fopen("sensor.txt", "r");
    if (!file) {
        perror("无法打开文件");
        return;
    }

    FILE *tempFile = fopen("temp.txt", "w");
    if (!tempFile) {
        perror("无法打开临时文件");
        fclose(file);
        return;
    }

    char line[100];
    while (fgets(line, sizeof(line), file)) {
        char id[100];
        sscanf(line, "%[^-]", id);
        if (strcmp(id, sensor_id) != 0) {
            fprintf(tempFile, "%s", line);
        }
    }

    fclose(file);
    fclose(tempFile);

    remove("sensor.txt");
    rename("temp.txt", "sensor.txt");

    char logMessage[200];
    sprintf(logMessage, "删除传感器成功，id为:%s", sensor_id);
    log(logMessage);

    unlock();

}

// 查询所有传感器
void select_sensor() {
    FILE *file = fopen("sensor.txt", "r");
    if (!file) {
        printf("文件不存在或为空\n");
        return;
    }

    char line[100];
    printf("传感器\t牛ID\t经度\t纬度\n");
    while (fgets(line, sizeof(line), file)) {
        char sensor_id[100], cattle_id[100];
        int longitude, latitude;
        sscanf(line, "%[^-]-%[^-]-%d-%d", sensor_id, cattle_id, &longitude, &latitude);
        printf("%s\t%s\t%d\t%d\n", sensor_id, cattle_id, longitude, latitude);
    }

    fclose(file);

    log("查询所有传感器");

}

// 修改传感器
void update_sensor() {
    char sensor_id[100];
    printf("请输入传感器的ID：\n");
    scanf("%s", sensor_id);

    // 判断ID是否存在
    if (!judge_sensor_id(sensor_id)) {
        printf("错误：传感器ID '%s' 不存在。\n", sensor_id);
        char logMessage[200];
        sprintf(logMessage, "该传感器不存在，修改失败，id为:%s", sensor_id);
        log(logMessage);
        return;
    }

    // 修改操作
    get_lock();

    FILE *file = fopen("sensor.txt", "r");
    if (!file) {
        perror("无法打开文件");
        return;
    }

    FILE *tempFile = fopen("temp.txt", "w");
    if (!tempFile) {
        perror("无法打开临时文件");
        fclose(file);
        return;
    }

    char line[100];
    while (fgets(line, sizeof(line), file)) {
        char id[100], cattle_id[100];
        int longitude, latitude;
        sscanf(line, "%[^-]-%[^-]-%d-%d", id, cattle_id, &longitude, &latitude);

        if (strcmp(id, sensor_id) == 0) {
            // 只更新经纬度
            printf("请输入新的经度：\n");
            scanf("%d", &longitude);
            printf("请输入新的纬度：\n");
            scanf("%d", &latitude);
        }

        // 将更新后的数据写入临时文件
        fprintf(tempFile, "%s-%s-%d-%d\n", id, cattle_id, longitude, latitude);
    }

    fclose(file);
    fclose(tempFile);

    // 删除原文件并重命名临时文件
    remove("sensor.txt");
    rename("temp.txt", "sensor.txt");

    char logMessage[200];
    sprintf(logMessage, "修改传感器成功，id为:%s", sensor_id);
    log(logMessage);

    unlock();

}



// 主菜单
void sensor() {
    int input = 0;
    while (1) {
        printf("--------------传感器--------------\n");
        printf("1.添加传感器\n");
        printf("2.删除传感器\n");
        printf("3.查询传感器\n");
        printf("4.修改传感器\n");
        printf("输入其他返回\n");
        scanf("%d", &input);
        switch (input) {
        case 1:
            add_sensor();
            break;
        case 2:
            delete_sensor();
            break;
        case 3:
            select_sensor();
            break;
        case 4:
            update_sensor();
            break;
        default:
            return;
        }
    }
}